توسعه قرارداد هوشمند با چارچوب Truffle - شرح قراردادهای سالیدیتی
- نحوه کامپایل، مهاجرت و آزمایش قراردادهای هوشمند
- راه اندازی مرورگر با MetaMask
- بررسی مورد استفاده اصلی
کیف پول های قفل شده در زمان: از موارد استفاده کنید
کاربردهای مختلفی از قراردادهای هوشمند اتریوم وجود دارد. محبوب ترین آنها در حال حاضر ارزهای رمزنگاری شده (که به عنوان توکن ERC20 پیاده سازی می شوند) و فروش توکن سرمایه گذاری جمعی (معروف به عرضه اولیه سکه یا ICOها) هستند. نمونه خوبی از توکن ERC20 ابزاری موتورو کوین است. در این پست وبلاگ، چیز متفاوتی را بررسی خواهیم کرد: ایده قفل کردن وجوه در قراردادهای کیف پول کریپتو. این ایده خود موارد استفاده مختلفی دارد.
تخصیص یک ICO
چندین مثال وجود دارد، اما احتمالاً رایج ترین دلیل در حال حاضر برای قفل کردن وجوه، «تخصیص سرمایه» نامیده می شود. تصور کنید که به تازگی یک ICO موفق ایجاد کرده اید و شرکت شما هنوز اکثر توکن های توزیع شده بین اعضای تیم شما را در اختیار دارد.
این امر برای همه طرفین درگیر مفید خواهد بود تا اطمینان حاصل شود که نشانه های نگهدارنده توسط کارمندان نمی توانند بلافاصله معامله شوند. در صورت عدم وجود کنترل ، هر کارمند داده شده ممکن است با فروش تمام نشانه های خود ، پول نقد و ترک شرکت اقدام کند. این امر بر قیمت بازار تأثیر منفی می گذارد و همه مشارکت کنندگان باقی مانده در این پروژه را ناراضی می کند.
"آخرین اراده و عهد" مبتنی بر رمزنگاری
ایده دیگر استفاده از یک قرارداد هوشمند به عنوان رمزنگاری است. تصور کنید که ما می خواهیم پس انداز رمزنگاری خود را در قراردادی که توسط اعضای خانواده قابل دسترسی خواهد بود ، ذخیره کنیم ، اما تنها پس از اتفاقی برای ما رخ داده است. بیایید بگوییم که ما باید با کیف پول "با کیف پول" را "بررسی کنیم".
اگر به موقع چک نکنیم ، اتفاقی برای ما افتاده است و آنها می توانند بودجه را پس بگیرند. نسبت وجوهی که هر یک از آنها دریافت می کنند می توانند صریحاً در قرارداد تعیین شوند ، یا می توان با اجماع بین اعضای خانواده تصمیم گرفت.
صندوق بازنشستگی یا اعتماد
یکی دیگر از برنامه های قفل کردن وجوه می تواند ایجاد یک صندوق بازنشستگی کوچک یا حساب پس انداز مبتنی بر زمان باشد ، یعنی مواردی که مانع از برداشت هرگونه وجوه قبل از زمان مشخص در آینده می شود.(این می تواند به ویژه برای معامله گران معتاد رمزنگاری در کمک به حفظ اتر خود مفید باشد.)
مورد استفاده ای که برای بقیه این پست وبلاگ کشف خواهیم کرد مشابه است: برای قرار دادن پول رمزنگاری برای بعداً برای شخص دیگری ، مانند هدیه تولد آینده.
بیایید تصور کنیم که می خواهیم یک اتر را برای تولد 18 سالگی به کسی هدیه دهیم. ما می توانیم روی یک کاغذ کلید خصوصی حساب و آدرس کیف پول که وجوه را نگه می دارد ، بنویسیم و آن را در یک پاکت به آنها تحویل دهیم. تنها کاری که آنها باید انجام دهند این است که پس از 18 سالگی ، یک عملکرد را از طریق حساب خود فراخوانی کنید و تمام وجوه به آنها منتقل می شود. یا در عوض ، ما فقط می توانیم از یک ðapp ساده استفاده کنیم. خوب به نظر می رسد؟بیا شروع کنیم!
راه اندازی توسعه اتریوم
قبل از اینکه با توسعه قرارداد هوشمند پیش بروید ، باید Node. js و Git را روی دستگاه خود نصب کنید. در این وبلاگ ، ما قصد داریم از چارچوب Truffle استفاده کنیم. حتی اگر شما می توانید بدون آن انجام دهید ، ترافل به طور قابل توجهی مانع ورود به توسعه ، آزمایش و استقرار قراردادهای هوشمند Ethereum را کاهش می دهد. ما کاملاً با بیانیه آنها موافق هستیم:
ترافل محبوب ترین چارچوب توسعه برای اتریوم با یک مأموریت است که زندگی شما را بسیار ساده تر کند.
برای نصب آن ، دستور زیر را اجرا کنید:
اکنون ، کد این پروژه را دریافت کنید:
توجه به این نکته حائز اهمیت است که این پروژه از ساختار استاندارد پروژه ترافل پیروی می کند و دایرکتوری های مورد علاقه عبارتند از:
- قراردادها: تمام قراردادهای استحکام را در اختیار دارد
- مهاجرت: شامل اسکریپت هایی است که مراحل مهاجرت را توصیف می کند
- SRC: شامل کد ðapp است
- آزمون: تمام تست های قرارداد را ذخیره می کند
نمای کلی از قراردادهای هوشمند شامل
چندین قرارداد در این پروژه وجود دارد. در اینجا Rundown آمده است:
- timelockedwallet. sol قرارداد اصلی این پروژه است و در زیر به تفصیل شرح داده شده است.
- TimelockedWalletFactory. Sol قرارداد کارخانه ای است که به هر کسی اجازه می دهد تا به راحتی TimelockedWallet خود را مستقر کند.
- ERC20. SOL رابط استاندارد ERC20 برای نشانه های اتریوم است.
- toptaltoken. sol یک نشانه ERC20 سفارشی است.
- Safemath. sol یک کتابخانه کوچک است که توسط Toptaltoken برای انجام عملیات حسابی ایمن استفاده می شود.
- Migrations. Sol یک قرارداد داخلی ترافل است که مهاجرت را تسهیل می کند.
برای هرگونه سؤال در مورد نوشتن قراردادهای اتریوم ، لطفاً به اسناد رسمی قرارداد Smart Smart Smart مراجعه کنید.
timelockedwallet. sol
قرارداد استحکام timelockedwallet. sol ما به این شکل است:
خط فوق نشانگر حداقل نسخه کامپایلر استحکام مورد نیاز این قرارداد است.
در اینجا ، ما تعاریف دیگر قرارداد را وارد می کنیم که بعداً در کد استفاده می شود.
موارد فوق هدف اصلی ما است. قرارداد کد قرارداد ما را تنظیم می کند. کد شرح داده شده در زیر از داخل براکت های فرفری است.
در اینجا ما چندین متغیر عمومی را تعریف می کنیم که به طور پیش فرض روش های مربوط به جمع آوری را تولید می کنند. یک زن و شوهر از آنها از نوع UINT (اعداد صحیح بدون امضا) و یک زن و شوهر آدرس (آدرس های اتریوم طولانی 16 شخصیت) هستند.
به عبارت ساده ، اصلاح کننده پیش شرط است که باید قبل از شروع اجرای عملکردی که به آن وصل شده است ، برآورده شود.
این اولین عملکرد ما است. از آنجا که نام دقیقاً مشابه نام قرارداد ما است ، سازنده است و فقط یک بار هنگام ایجاد قرارداد فراخوانی می شود.
توجه داشته باشید که اگر می خواهید نام قرارداد را تغییر دهید ، این به یک عملکرد عادی تبدیل می شود که توسط هر کسی قابل تماس باشد و در قرارداد شما یک پشتی تشکیل دهد ، مانند این که در اشکال کیف پول Parity Multisig وجود دارد. علاوه بر این ، توجه داشته باشید که پرونده نیز اهمیت دارد ، بنابراین اگر این نام عملکرد در حروف کوچک باشد ، به یک عملکرد معمولی تبدیل می شود - دوباره ، نه چیزی که شما در اینجا می خواهید.
عملکرد فوق از یک نوع خاص است و عملکرد Fallback نامیده می شود. اگر کسی ETH را به این قرارداد بفرستد ، ما با خوشحالی آن را دریافت خواهیم کرد. مانده ETH قرارداد افزایش می یابد و باعث ایجاد یک رویداد دریافت می شود. برای فعال کردن هرگونه کارکرد دیگر برای پذیرش ETH ورودی ، می توانید آنها را با کلمه کلیدی قابل پرداخت علامت گذاری کنید.
این اولین عملکرد منظم ما است. این پارامترهای عملکردی ندارد و خروجی خروجی را برای بازگشت تعریف می کند. توجه داشته باشید که این. تعادل ، تراز اتر فعلی این قرارداد را برمی گرداند.
عملکرد فوق فقط در صورتی اجرا می شود که تنها اصلاح کننده تنها در اوایل تعریف شده باشد. اگر بیانیه مورد نیاز صحیح نباشد ، قرارداد با خطا خارج می شود. این جایی است که ما بررسی می کنیم که آیا بازشویی از بین رفته است یا خیر. msg. sender تماس گیرنده این عملکرد است و کل تعادل اتر قرارداد را منتقل می کند. در خط آخر ، ما نیز یک رویداد عقب نشینی را آتش می زنیم. حوادث کمی بعد توصیف می شوند.
جالب اینجاست که اکنون - که معادل Block. timestamp است - ممکن است به همان اندازه که ممکن است فکر کند دقیق نباشد. انتخاب آن برای معدنچی است ، بنابراین می تواند تا 15 دقیقه (900 ثانیه) از آنجا که در فرمول زیر توضیح داده شده است:
در نتیجه ، اکنون نباید برای اندازه گیری واحدهای کوچک زمان استفاده شود.
در اینجا عملکرد ما برای برداشت نشانه های ERC20 است. از آنجا که خود این قرارداد از هر نشانه ای که به این آدرس اختصاص داده شده است آگاه نیست ، ما باید در آدرس نشانه ERC20 مستقر که می خواهیم از آن خارج شویم عبور کنیم. ما آن را با ERC20 (_tokencontract) فوری می کنیم و سپس کل تعادل توکن را به گیرنده می یابیم. ما همچنین یک رویداد Redrewtokens را آتش می زنیم.
در این قطعه ، ما چندین رویداد را تعریف می کنیم. رویدادهای تحریک شده اساساً ورودی های ورود به سیستم به رسیدهای معامله موجود در blockchain هستند. هر معامله می تواند ورودی های ورود به سیستم صفر یا بیشتر باشد. کاربردهای اصلی وقایع اشکال زدایی و نظارت است.
این تنها چیزی است که ما نیاز داریم تا به نشانه های اتر و ERC20 بپردازیم-فقط چند خط کد. خیلی بد نیست ، ها؟حال بیایید نگاهی به قرارداد دیگر ما ، TimelockedWalletFactory. sol بیندازیم.
timelockedwalletfactory. sol
دو دلیل اصلی ایجاد یک قرارداد کارخانه سطح بالاتر وجود دارد. اولین مورد نگرانی امنیتی است. با جدا کردن وجوه در کیف پول های مختلف ، ما فقط با یک قرارداد با تعداد زیادی اتر و نشانه ها به پایان نمی رسیم. این کار 100 ٪ کنترل را فقط به صاحب کیف پول می دهد و امیدوارم هکرها را از تلاش برای بهره برداری از آن دلسرد کند.
ثانیاً ، یک قرارداد کارخانه اجازه می دهد تا بدون نیاز به حضور در توسعه ، ایجاد قرارداد TimelockedWallet آسان و بی دردسر باشد. تمام کاری که شما باید انجام دهید این است که از یک کیف پول دیگر یا đapp یک عملکرد را فراخوانی کنید.
موارد فوق ساده و بسیار شبیه به قرارداد قبلی است.
در اینجا ، ما یک نوع نقشه برداری را تعریف می کنیم ، که مانند فرهنگ لغت یا نقشه است ، اما با تمام کلیدهای ممکن از پیش تعیین شده و به مقادیر پیش فرض اشاره می کنیم. در مورد نوع آدرس ، پیش فرض آدرس صفر 0x00 است. ما همچنین یک نوع آرایه ، آدرس [] ، که آدرس های خود را در اختیار دارد ، داریم.
در زبان استحکام ، آرایه ها همیشه حاوی یک نوع هستند و می توانند دارای طول ثابت یا متغیر باشند. در مورد ما ، آرایه بدون مرز است.
برای خلاصه کردن منطق کسب و کار ما در اینجا ، ما نقشه برداری به نام کیف پول را تعریف می کنیم که از آدرس های کاربر تشکیل شده است - سازندگان و صاحبان قرارداد به طور یکسان - هرکدام به مجموعه ای از آدرس های قرارداد کیف پول مرتبط اشاره دارند.
در اینجا ، ما از عملکرد فوق استفاده می کنیم تا کلیه کیف پول های قرارداد را _user ایجاد شده یا حق آن را برگردانیم. توجه داشته باشید که نمای (در نسخه های قدیمی تر به نام ثابت) بیانگر این است که این تابعی است که حالت blockchain را تغییر نمی دهد و بنابراین می توان بدون صرف هزینه گاز ، به صورت رایگان فراخوانی کرد.
این مهمترین بخش قرارداد است: روش کارخانه. این امکان را به ما می دهد تا با فراخوانی سازنده آن ، یک کیف پول جدید قفل شده را در پرواز ایجاد کنیم: New TimelockedWallet (msg. sender ، _owner ، _unlockdate). سپس آدرس آن را برای خالق و گیرنده ذخیره می کنیم. بعداً تمام اتر اختیاری را که در این اجرای عملکرد منتقل شده است به آدرس کیف پول تازه ایجاد شده منتقل می کنیم. سرانجام ، ما رویداد ایجاد را نشان می دهیم ، تعریف شده به عنوان:
toptaltoken. sol
این آموزش اگر نتوانیم نشانه اتریوم خودمان را ایجاد نکردیم ، بسیار سرگرم کننده نخواهد بود ، بنابراین برای کامل بودن ، ما به زندگی Toptaltoken می پردازیم. ToptalToken یک نشانه استاندارد ERC20 است که رابط ارائه شده در زیر را اجرا می کند:
آنچه آن را از سایر نشانه ها متمایز می کند در زیر تعریف شده است:
ما به آن یک نام ، یک نماد ، عرضه کامل یک میلیون ، و آن را تا شش اعشار قابل تقسیم ساختیم.
برای کشف تغییرات مختلف قراردادهای توکن ، احساس راحتی کنید تا در repo OpenZeppelin را کشف کنید.
Truffle Console: کامپایل ، مهاجرت و آزمایش قراردادهای هوشمند
برای شروع سریع ، ترافل را با blockchain داخلی اجرا کنید:
شما باید چیزی شبیه به این را ببینید:
دانه Mnemonic به شما امکان می دهد کلیدهای خصوصی و عمومی خود را از نو بسازید. به عنوان مثال ، همانطور که در اینجا نشان داده شده است ، آن را به metamask وارد کنید:
برای تدوین قراردادها ، اجرا کنید:
حال ، ما باید تعریف کنیم که قراردادهایی را که می خواهیم مستقر کنیم. این کار در مهاجرت انجام می شود/2_deploy_contracts. js:
ما ابتدا دو مصنوعات قرارداد خود را TimelockedWalletFactory و ToptalToken وارد می کنیم. سپس ما به سادگی آنها را مستقر می کنیم. ما TimelockedWallet را با هدف از دست دادیم ، زیرا این قرارداد به صورت پویا مستقر شده است. برای کسب اطلاعات بیشتر در مورد مهاجرت ، لطفاً به مستندات مهاجرت Truffle مراجعه کنید.
برای مهاجرت قراردادها ، اجرا کنید:
این باید به چیزی شبیه به موارد زیر منجر شود:
می توانید بگویید که TimelockedWalletFactory و ToptalToken با موفقیت مستقر شدند.
سرانجام ، برای اطمینان از کار خوب همه ، اجازه دهید برخی از تست ها را انجام دهیم. این آزمایشات در فهرست آزمون واقع شده و مطابق با قراردادهای اصلی timelockedwallettest. js و timelockedwalletfactorytest. js است. برای کوتاه بودن ، ما به جزئیات تست های نوشتن نمی پردازیم و آن را به عنوان یک تمرین برای خواننده رها نمی کنیم. برای اجرای تست ها ، به سادگی اجرا کنید:
... و امیدوارم که شما تمام آزمایشات مانند این را مشاهده کنید:
کیف پول قفل شده زمان
وقت آن است که همه چیز را در عمل ببینیم. ساده ترین راه برای تعامل با هرگونه blockchain استفاده از برنامه های توزیع شده با UI وب ، به اصطلاح heapps (یا گاهی اوقات "dapps" است.)
تنظیم برنامه توزیع شده
برای اجرای این کار ، باید یک مرورگر فعال شده با اتریوم داشته باشید. ساده ترین راه برای دستیابی به این امر ، نصب افزونه Metamask Chrome است. همچنین یک راهنمای بصری در مورد نصب و پیکربندی Metamask با ترافل وجود دارد.
سناریوی قرارداد هوشمند
با بازگشت به سناریوی ما ، چرا ما ابتدا بازیگران را معرفی نمی کنیم؟بیایید فرض کنیم آلیس خالق کیف پول قفل شده زمان خواهد بود و باب گیرنده/نهایی مالک وجوه خواهد بود.
- آلیس یک کیف پول قفل شده برای باب ایجاد می کند و برخی از اخلاق را می فرستد
- علاوه بر این ، آلیس برخی از نشانه های ERC20 TOPTAL را ارسال می کند
- باب می تواند کیف پول هایی را که به او دسترسی دارد و آنهایی که او ایجاد کرده است ببیند
- باب نمی تواند قبل از انقضا قفل زمان کیف پول ، بودجه خود را پس بگیرد
- باب هنگامی که باز شد ETH را پس می گیرد
- باب تمام نشانه های TOPTAL ERC20 را برداشت می کند
در مرحله اول ، آلیس یک کیف پول قفل شده برای باب ایجاد می کند و یک اتر اولیه را می فرستد. می توانیم ببینیم که یک کیف پول قرارداد جدید ایجاد شده است و متعلق به باب است:
در هر نقطه پس از ایجاد قرارداد ، کیف پول را می توان در صدر قرار داد. قسمت بالایی می تواند از هر کسی باشد و به صورت توکن اتر یا ERC20 باشد. بیایید آلیس 100 توکن Toptal را به کیف پول جدید باب ارسال کنیم همانطور که در اینجا به تصویر کشیده شده است:
از دیدگاه آلیس ، کیف پول بعد از بالا به این شکل خواهد بود:
بیایید اکنون نقش ها را تغییر دهیم و به عنوان باب وارد شوید. باب باید بتواند تمام کیف پول هایی را که او ایجاد کرده است ببیند یا گیرنده آن است. از آنجا که قرارداد ایجاد شده توسط آلیس هنوز هم بسته است ، او نمی تواند هیچ بودجه ای را پس بگیرد:
با صبر صبر کرد تا قفل منقضی شود ...
… باب اکنون آماده است تا هر دو نشانه اتر و TOPTAL را پس بگیرد:
پس از خالی کردن کیف پول قفل شده ، تعادل آدرس وی افزایش یافته است و او را از آلیس بسیار خوشحال و سپاسگزارم:
شبکه اتریوم
اگر می خواهید با قراردادهای توصیف شده تعامل داشته باشید ، لازم نیست آنها را به صورت محلی اجرا کنید: ما آنها را به Ethereum Rinkeby Testnet مستقر کرده ایم. ToptalToken در اینجا مستقر شده است و TimelockedWalletFactory در اینجا مستقر می شود.
شما می توانید از ðAPP مستقر شده ما استفاده کنید ، که به قراردادهای فوق که توسط صفحات GitHub ارائه شده است ، مرتبط است. توجه داشته باشید که به Metamask نصب شده و به Rinkeby وصل شده اید.
عیب یابی
ما هنگام تدوین این پروژه با چند مسئله روبرو شده ایم. اولین مورد پوسته پوسته شدن Metamask در Chrome بود (مانند شکایت از غیرقانونی نامعتبر). ساده ترین راه حل ما فقط برای نصب مجدد افزونه بود.
همچنین ، ترافل گاهی اوقات هنگام ویرایش قراردادهای هوشمند از همگام سازی خارج می شود و با تعداد نامعتبر خطای پارامترهای استحکام شکایت می کند. ما دریافتیم که یک R M-R ساده ساخت و انجام کامپایل/مهاجرت دوباره آن را پاک می کند.
توسعه اتریوم: ارزش منحنی یادگیری شیب دار
ما امیدواریم که این مقاله علاقه شما را کمرنگ کرده و سفر توسعه دهنده خود را به سرزمین اتریوم آغاز کنید. مسیر جلال سایبری شیب دار و وقت گیر خواهد بود ، اما منابع زیادی در آنجا وجود دارد که به شما کمک می کند (مانند این مورد که به ما کمک می کند تا یک بیت عادلانه به ما کمک کند). از طریق نظرات زیر در تماس باشید.
کد منبع این پروژه در GitHub موجود است.
اگر می خواهید بدانید که چگونه به جای metamask از یک برنامه موبایل Uport استفاده کنید ، نگاهی به نسخه ی نمایشی و منبع یک نسخه جایگزین ، برنده هکاتون از این پروژه بیندازید.
من همچنین از شما استقبال می کنم که آموزش پیگیری من را بخوانید ، که در ایجاد đapp تمرکز دارد.
وام
با تشکر فراوان از Maciek Zielinski به دلیل مشارکت وی در این پروژه.
خواندن بیشتر در وبلاگ مهندسی TOPTAL:
درک اصول
قرارداد هوشمند چیست؟
یک قرارداد هوشمند یک کد رایانه ای است که در بالای دستگاه مجازی Ethereum اجرا می شود. قراردادهای هوشمند می توانند اتر و داده را ارسال و بپذیرند. قراردادها از نظر ماهیت تغییر ناپذیر هستند ، مگر اینکه در غیر این صورت برنامه ریزی شود.
دستگاه مجازی اتریوم چیست؟
دستگاه مجازی Ethereum (EVM) یک محیط زمان اجرا ماسهبازی برای قراردادهای هوشمند است که به عنوان یک دستگاه پشته اجرا می شود که کد بایت را اجرا می کند. این تمرکز بر تأمین امنیت و اجرای کد غیرقابل اعتماد توسط رایانه ها در سراسر جهان است.
غبار و کیف پول اتریوم چیست؟
غبار مرورگر رسمی برنامه های توزیع شده (đAPPS ، گاهی اوقات DAPP) است که جلوی/UI های کاربر پسند/UI به شبکه Ethereum هستند. کیف پول Ethereum یکی از این موارد است. هر دو توسط همان افرادی که اتریوم ساخته اند ساخته شده اند.
منبع باز اتریوم است؟
به نقل از ویتالیک باترین ، مخترع اتریوم: "همه چیز در اتریوم ، از جمله وب سایت ، ابزارها ، سفیدپوستان و البته همه نرم افزار و کامپایلرها 100 ٪ ، دیوار به دیوار منبع باز و زیر GPL هستند."
آیا اتریوم غیر متمرکز است؟
بله ، از نظر طبیعت کاملاً غیر متمرکز است. عملیات خواندن و نوشتن کاملاً غیرمتمرکز است و در حال حاضر توسط یک مکانیسم اثبات کار تضمین می شود. Ethereum به گونه ای طراحی شده است که هیچ شخص یا گروهی مجرد blockchain را کنترل نمی کند.
اتریوم از چه زبان برنامه نویسی استفاده می کند؟
زبان انتخاب اتریوم در حال حاضر استحکام است. استحکام یک زبان برنامه نویسی قرارداد گرا است ، که عمدتاً با الهام از JavaScript ، C ++ و Python که برای نوشتن قراردادهای هوشمند استفاده می شود. زبان های دیگری نیز در افق وجود دارد ، مانند Vyper.
نشانه های ERC20 چیست؟
توکن ها قراردادهای هوشمندانه ای هستند که استاندارد ERC20 را اجرا می کنند. آنها شامل عملیاتی مانند دریافت کل عرضه و تعادل و روش های انتقال نشانه ها در اطراف هستند. توکن ها هرگز واقعاً قرارداد را ترک نمی کنند ، بلکه به سادگی در یک نقشه برداری داخلی به آدرس کیف پول یک دارنده متفاوت واگذار می شوند.